package cn.jsj.onclock.dao;

import cn.jsj.onclock.pojo.UserJoinRequest;
import cn.jsj.onclock.pojo.identity.ApproveResultEnum;
import cn.jsj.onclock.pojo.identity.GroupIdentityEnum;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户加群申请
 * @author 卢斌
 */
@Mapper
public interface UserJoinRequestDao {

    /**
     * 新增一个用户加群申请
     *
     * @param userId    用户Id
     * @param groupId   目标群组Id
     * @param message   申请留言
     * @param leaveName 申请留名
     */
    void insertUserJoinRequest(@Param("userId") Long userId, @Param("groupId") Long groupId, @Param("message") String message, @Param("leaveName") String leaveName);

    /**
     * 新增一个用户加群申请（用户Id，目标群组Id, 申请者留言，申请者留名）
     *
     * @param joinRequest   申请信息实体
     */
    void insertUserJoinRequestEntity(UserJoinRequest joinRequest);


    /**
     * Id查询用户加群申请信息
     *
     * @param joinRequestId     申请信息Id
     * @return  申请信息实体
     */
    UserJoinRequest getJoinRequestById(@Param("joinRequest") Long joinRequestId);



    /**
     * 查询用户的申请记录
     *
     * @param userId    用户Id
     * @param result    申请状态（申请结果）
     * @return  用户的加群申请信息
     */
    List<UserJoinRequest> listRequestByUserId(@Param("userId") Long userId, @Param("result") ApproveResultEnum result);


    /**
     * 查询群组收到的加群申请
     *
     * @param groupId   群组Id
     * @param result    审批结果
     * @return  收到的加群申请
     */
    List<UserJoinRequest> listRequestByGroupId(@Param("groupId") Long groupId, @Param("result") ApproveResultEnum result);


    /**
     * 对提交的用户加群申请进行审批
     *
     * @param joinRequestId 申请信息Id
     * @param judgeUserId   审批者
     * @param result        审批结果
     * @return  数据库影响条数
     */
    Integer updateRequestResult(@Param("requestId") Long joinRequestId, @Param("userId") Long judgeUserId, @Param("result") ApproveResultEnum result);


    /**
     * 删除用户加群申请信息
     *
     * @param groupId   删除用户的加群申请信息
     * @return  删除数据条数
     */
    Integer deleteUserJoinRequests(@Param("groupId") Long groupId);


    /**
     * 查询群内符合身份要求的成员用户Id
     *
     * @param groupId   群组Id
     * @param identity  群内身份列表
     * @return 内符合身份要求的成员用户Id
     */
    List<Long> listUserIdInGroupWithSpecialIdentity(@Param("groupId") Long groupId, @Param("identity") List<GroupIdentityEnum> identity);


}
